package com.xinzhi.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.api.R;
import com.xinzhi.domain.Cart;
import com.xinzhi.domain.vo.CartProductVo;
import com.xinzhi.domain.vo.CartVo;
import com.xinzhi.mapper.CartMapper;
import com.xinzhi.mapper.ProductMapper;
import com.xinzhi.service.CartService;
import com.xinzhi.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.List;

@Service
public class CartServiceImpl implements CartService {

    @Resource
    CartMapper cartMapper;

    @Resource
    ProductMapper productMapper;


    @Override
    public Result addProductToCart(String userId, String productId) {
        // 判空
        List<Integer> integers = stringToInteger(userId, productId);
        if (integers.size()==0){
            return Result.error("参数为空");
        }
        // 判断购物车中商品数量是否大于或等于20
        if (checkUserCartNum(integers.get(0))){
            return Result.error(5002,"购物车已满");
        }

        // 查询用户购物车中是否有该商品
        Cart cart = cartMapper.queryProductNum(integers.get(0), integers.get(1));
        System.out.println("购物车"+cart);
        Integer i = 0;
        // 查询商品库存
        Integer stock = productMapper.queryProductNumById(integers.get(1));
        System.out.println(stock);
        if (stock == 0){
            return Result.error(5001,"库存不足");
        }
        // 判断对象是否为空
        if (ObjectUtil.isEmpty(cart)){
            // 购物车中没有该商品
            Cart cart1 = new Cart();
            cart1.setProductId(integers.get(1));
            cart1.setUserId(integers.get(0));
            cart1.setNum(1);
            i = cartMapper.addProduct(cart1);
        }else {
            // 购物车中存在该商品  先判断库存
            // 如果此时购物车中的商品数量 + 1 大于库存 则添加失败
            if(cart.getNum()+1 > stock){
                return Result.error(5001,"库存不足");
            }
            i = cartMapper.plusProductNum(integers.get(0), integers.get(1));
        }
        if (i > 0){
            return Result.ok("商品成功加入购物车");
        }
        return Result.error(50005,"系统异常添加失败");
    }

    @Override
    public Result plusProductToCart(String userId, String productId) {
        // 判空
        List<Integer> integers = stringToInteger(userId, productId);
        if (integers.size()==0){
            return Result.error("参数为空");
        }

        // 查询库存
        Integer stock = productMapper.queryProductNumById(integers.get(1));
        // 获取当前购物车中商品的数量
        Cart cart = cartMapper.queryProductNum(integers.get(0),integers.get(1));
        // 判断cart 对象是否为空
        if (ObjectUtil.isEmpty(cart)){
            return Result.error(50005,"购物车中不存在该商品");
        }
        // 判断商品数量 + 1 后是否大于库存
        if(cart.getNum() + 1 > stock){
            return Result.error(5001,"库存不足");
        }
        Integer integer = cartMapper.plusProductNum(integers.get(0), integers.get(1));
        if (integer > 0){
            return Result.ok("数量+1");
        }
        return Result.error(50005,"系统异常，请求失败");

    }

    @Override
    public Result subtractProductToCart(String userId, String productId) {
        // 判空
        List<Integer> integers = stringToInteger(userId, productId);
        if (integers.size()==0){
            return Result.error("参数为空");
        }
        // 查询购物车中商品信息
        Cart cart = cartMapper.queryProductNum(integers.get(0), integers.get(1));

        // 判断购物车中是否有该商品
        if (ObjectUtil.isEmpty(cart)){
            return Result.error(50005,"购物车中不存在该商品");
        }


        // 如果购物车中的商品数量为 1  则删除该商品
        if (cart.getNum() == 1){
            cartMapper.delProduct(integers.get(0), integers.get(1));
            return Result.ok("商品已删除");
        }
        Integer integer = cartMapper.subtractProductNum(integers.get(0), integers.get(1));
        if (integer > 0){
            return Result.ok("数量-1");
        }
        return Result.error(50005,"系统异常，请求失败");
    }

    @Override
    public Result deleteProductToCart(String userId, String productId) {
        // 判空
        List<Integer> integers = stringToInteger(userId, productId);
        if (integers.size()==0){
            return Result.error("参数为空");
        }
        Integer integer = cartMapper.delProduct(integers.get(0), integers.get(1));
        if (integer == 0){
            return Result.error(50005,"购物车中不存在该商品");
        }
        return Result.ok("商品已删除");
    }

    @Override
    public Result changeProductSelected(String userId, String productId) {
        // 实现功能： 改变购物车商品的选中状态
        // 参数判空
        List<Integer> integers = stringToInteger(userId, productId);
        if (integers.size()==0){
            return Result.error("参数为空");
        }
        // 1、 查询执行该请求时用户购物车中该商品的选中状态
        Cart cart = cartMapper.queryProductNum(integers.get(0), integers.get(1));
        Integer selected = cart.getSelected();
        // 2、 取出该商品的选中状态  1 表示未选中  0 表示选中
        Integer i = 0;

        if (selected == 1){
            i = cartMapper.changeSelected(integers.get(0),integers.get(1),0);
        }else {
            i = cartMapper.changeSelected(integers.get(0),integers.get(1),1);
        }
        if (i == 0){
            return Result.error(50005,"系统异常，商品选中状态未更改");
        }
        return Result.ok("商品已取消选中状态");
    }

    @Override
    public Result changeAllProductSelected(String userId) {
        // 功能： 全选 / 全不选
        // 判空
        if(userId == "" || userId == null){
            return Result.error("参数为空");
        }
        // 执行到此处 说明参数不为空 转换参数类型
        Integer tempUserId = Integer.valueOf(userId);

        // 查询该用户购物车中的所有数据
        List<Cart> carts = cartMapper.queryAllCart(tempUserId);
        // 定义参数 selected 表示选中状态  此处设置为 1 表示之后需要将所有的商品选中状态设置为未选中
        Integer selected = 1;
        // 遍历购物车信息集合判断用户的选中状态
        for (Cart cart : carts) {
            // 循环遍历判断 选中状态 只要有一个商品的状态为未选中 说明此次操作是需要将所有商品选中
            if (cart.getSelected() == 1){
                selected = 0;
                break;
            }
        }
        // 经过以上代码我们可以确定用户此次操作的需求  全选/全不选
        Integer integer = cartMapper.changeAllSelected(tempUserId,selected);
        if (integer == 0){
            return Result.error(50005,"系统异常，请稍后重试");
        }
        return Result.ok("执行成功");
    }

    @Override
    public Result checkCartByUserId(String userId) {
        //  功能： 查看购物车
        //  包含内容：商品信息（主图、名称、价格）商品数量（选中的） 商品总价 （选中的）  全选按钮的状态（是否为全选）
        //  参数校验
        if (userId == null || userId == ""){
            return Result.error("参数错误");
        }
        //  转换参数类型
        Integer tempUserId = Integer.valueOf(userId);
        /**
         * 查询购物车记录
         * CartProductVo  参数：
         *     id             商品 id
         *     productName    商品名
         *     price          单价
         *     mainImg        商品主图
         *     num            数量
         *     selected       选中状态
         */
        List<CartProductVo> cartProductVos = cartMapper.queryCartDetail(tempUserId);

        //  定义参数记录  1、是否为全选 2、累加选中商品的总价 3、记录选中商品的数量
        //  全选状态 初始置为 0  指当默认为全选
        Integer selected = 0;
        //  用户选中的商品总价
        BigDecimal totalPrice = new BigDecimal("0");
        //  用户选中的商品数量总计
        Integer totalNum = 0;
        for (CartProductVo cartProductVo : cartProductVos) {
            // 判断是否选中
            if (cartProductVo.getSelected() == 0){
                // 累加数量
                totalNum += cartProductVo.getNum();
                // 计算总价
                // 转换数量的参数类型
                BigDecimal num = BigDecimal.valueOf(cartProductVo.getNum());
                BigDecimal price = cartProductVo.getProductIntroVo().getPrice();
                // 计算单个商品的价钱
                BigDecimal subtotal = price.multiply(num, MathContext.DECIMAL32);
                // 计算总价
                totalPrice = totalPrice.add(subtotal,MathContext.DECIMAL32);
            }
        }
        // 判断选中数量与购物集合长度是否一致 一致说明用户全选
        if (totalNum == cartProductVos.size()){
            selected = 1;
        }

        // CartVo
        CartVo cartVo = new CartVo();
        // 购物车详情
        cartVo.setCartProductVoList(cartProductVos);
        // 全选状态
        cartVo.setAllSelected(selected);
        // 选中数量
        cartVo.setTotalNum(totalNum);
        // 总计
        cartVo.setTotalPrice(totalPrice);

        return Result.ok(cartVo);
    }


    // 转换参数类型
    public List<Integer> stringToInteger(String one,String two){
        // 创建集合用来存储转换之后的数据
        List<Integer> integerList = new ArrayList<>();
        // 对传入的参数进入判空
        if (one == null || one =="" || two == null || two ==""){
            // 只要一个为空返回空集合
            return integerList;
        }
        // 执行到此处 说明参数不为空  转换参数类型
        Integer tempUserId = Integer.valueOf(one);
        Integer tempProductId = Integer.valueOf(two);
        // 将转换完成的参数添加到集合中
        integerList.add(tempUserId);
        integerList.add(tempProductId);

        return integerList;
    }
    // 查看当前用户购物车商品数量是否大于20
    public Boolean checkUserCartNum(Integer userId){
//        QueryWrapper queryWrapper = new QueryWrapper();
//        queryWrapper.eq("user_id",userId);
//        Integer cartNum = cartMapper.selectCount(queryWrapper);

        Integer cartNum = cartMapper.checkCartNumByUserId(userId);
        if (cartNum >=20){
            return true;
        }
        return false;
    }



}
